/*
 * Nombre: DAOAsignaturaOptativa.java
 * Version: 1.0.0
 * Diagrama: GAPI v2.3.1
 * Autor: Amado de Jesús Canté Cauich
 * Creado: 20-feb-2013
 * Caso de uso: MGPE1
 * Modificado: 31-mar-2013 Alberto Castro
 */
package DAO;

import AccesoBD.AccesoBaseDatos;
import Dominio.AreaConcentracion;
import Dominio.Asignatura;
import Dominio.AsignaturaOptativa;
import Dominio.ProgramaEducativo;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * Clase que controla
 */
public class DAOAsignaturaOptativa {
    private static final String COLUMNA_ID = "id";
    private static final String COLUMNA_CVE_ASIGNATURA = "cveAsignatura";
    private static final String COLUMNA_CVE_PROGRAMA = "cveProgramaEducativo";
    private static final String COLUMNA_CVE_AREA_CONCENTRACION = "cveAreaConcentracion";
    private static final String TABLA_OPTATIVAS = "optativas";
    private AccesoBaseDatos acceso = new AccesoBaseDatos();
    private Connection conexion = null;
    private DAOAsignatura daoAsignatura;
/**
 * Constructor
 */
    public DAOAsignaturaOptativa() {
        this.conexion = this.acceso.abrirConexion();
        this.daoAsignatura = new DAOAsignatura();
    }
    /**
     * Verifica si existe la asignatura optativa.
     * @param optativa La asignatura
     * @return Verdadero si existe y falso si no.
     */
    public boolean existeOptativa(AsignaturaOptativa optativa){
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String querySearch = "SELECT * FROM "+ TABLA_OPTATIVAS + " WHERE " + COLUMNA_CVE_ASIGNATURA
                    +" = '"+optativa.getClaveAsignatura()+"' AND "+COLUMNA_CVE_PROGRAMA+" = '"+optativa.getProgramaEducativo().getCvePrograma()
                    +"' AND "+COLUMNA_CVE_AREA_CONCENTRACION+" ='"+optativa.getAreaDeConcentracion().getClaveArea()+"'";
            ResultSet resultado = sentencia.executeQuery(querySearch);
            System.out.println(resultado.getRow());
            int contadorDeRegistros = 0;
            while (resultado.next()) {
                contadorDeRegistros++;
            }

            if (contadorDeRegistros != 0) {
                return true;
            } else {
                return false;
            }
        } catch (SQLException ex) {
            Logger.getLogger(DAOAsignaturaOptativa.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }
    /**
     * Registra la asignatura optativa
     * @param optativa Asignatura a registrar
     */
    public void registrarAsignaturaOptativa(AsignaturaOptativa optativa){
        if(this.daoAsignatura.existeAsignatura(optativa)){
                try {
                    Asignatura asignatura = daoAsignatura.buscaAsignatura(optativa.getNombre());                   
                    
                    int cveAsignatura = asignatura.getClaveAsignatura();
                    int cvePrograma = optativa.getProgramaEducativo().getCvePrograma();
                    int cveAreaConcentracion = optativa.getAreaDeConcentracion().getClaveArea();
                    Statement sentencia = acceso.crearSentenciaBD(conexion);
                    String queryInsertar = "INSERT INTO " + TABLA_OPTATIVAS + " (" + COLUMNA_CVE_ASIGNATURA + ","+COLUMNA_CVE_PROGRAMA+","
                            +COLUMNA_CVE_AREA_CONCENTRACION+") VALUES ('"+cveAsignatura+"','"+cvePrograma+"','"+cveAreaConcentracion+"')";
                    sentencia.executeUpdate(queryInsertar);
                } catch (SQLException ex) {
                    System.out.println("Ocurrió un problema al tratar de registrar la asignatura");
                }
            }else{
                Asignatura asignatura = daoAsignatura.registraAsignatura(optativa);
                AsignaturaOptativa aoptativa = new AsignaturaOptativa(optativa.getAreaDeConcentracion(),asignatura.getClaveAsignatura(),asignatura.getNombre());
                aoptativa.setProgramaEducativo(optativa.getProgramaEducativo());
                this.registrarAsignaturaOptativa(aoptativa);
            }
    }
    /**
     * Registra asignatura optativa
     * @param cveAsignatura Clave de la asignatura
     * @param cvePrograma Clave del programa educativo
     * @param cveAreaConcentracion Clave del area de concentracion
     */
    public void registrarAsignaturaOptativa(int cveAsignatura,int cvePrograma,int cveAreaConcentracion){
        
        if(!this.existeOptativa(cveAsignatura,cvePrograma,cveAreaConcentracion)){
            try {                
                Statement sentencia = acceso.crearSentenciaBD(conexion);
                String queryInsertar = "INSERT INTO " + TABLA_OPTATIVAS + " (" + COLUMNA_CVE_ASIGNATURA + ","+COLUMNA_CVE_PROGRAMA+","
                        +COLUMNA_CVE_AREA_CONCENTRACION+") VALUES ('"+cveAsignatura+"','"+cvePrograma+"','"+cveAreaConcentracion+"')";
                sentencia.executeUpdate(queryInsertar);
            } catch (SQLException ex) {
                System.out.println("Ocurrió un problema al tratar de registrar la asignatura");
                ex.printStackTrace();
            }
        }else{
            System.out.println("Ya existe la asignatura optativa que intenta registrar.");
        }
    }

    private boolean existeOptativa(int cveAsignatura, int cvePrograma, int cveAreaConcentracion) {
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String querySearch = "SELECT * FROM "+ TABLA_OPTATIVAS + " WHERE " + COLUMNA_CVE_ASIGNATURA
                    +" = '"+cveAsignatura+"' AND "+COLUMNA_CVE_PROGRAMA+" = '"+cvePrograma
                    +"' AND "+COLUMNA_CVE_AREA_CONCENTRACION+" ='"+cveAreaConcentracion+"'";
            ResultSet resultado = sentencia.executeQuery(querySearch);
            System.out.println(resultado.getRow());
            int contadorDeRegistros = 0;
            while (resultado.next()) {
                contadorDeRegistros++;
            }

            if (contadorDeRegistros != 0) {
                return true;
            } else {
                return false;
            }
        } catch (SQLException ex) {
            Logger.getLogger(DAOAsignaturaOptativa.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }
/**
* Verifica si se registraron las asignaturas optativas.
* @param programa El programa educativo
* @return Verdadero si se registraron o falso si no. 
*/
    protected boolean registrarOptativas(ProgramaEducativo programa){
        boolean exito = false;
        ArrayList<AsignaturaOptativa> optativas = programa.getReticula().getAsignaturasOptativas();
        DAOAreaConcentracion daoAreaConcentracion = new DAOAreaConcentracion();
        for(int i=0;i<optativas.size();i++){
            AsignaturaOptativa optativa = optativas.get(i);
            //optativa.setPrograma(programa);
            AreaConcentracion area  = daoAreaConcentracion.registraAreaConcentracion(optativa.getAreaDeConcentracion());
            optativa.setAreaDeConcentracion(area);
            this.registrarAsignaturaOptativa(optativa);
            exito = true;
        }
        return exito;
    }
    /**
     * Actualiza las asignaturas optativas del programa educativo.
     * @param optativas Asignaturas optativas para actualizar
     * @param claveProgramaEducativo Clave del programa educativo
     * @return Exito o no si se actualizaron.
     */
    protected boolean actualizaOptativasPE(ArrayList<AsignaturaOptativa> optativas,int claveProgramaEducativo){
        boolean exito = false;
        DAOAreaConcentracion daoAreaConcentracion = new DAOAreaConcentracion();
        this.eliminarOptativasProgramaEducativo(claveProgramaEducativo);
            for(int i=0;i<optativas.size();i++){
                AsignaturaOptativa optativa = optativas.get(i);
             
                AreaConcentracion area  = daoAreaConcentracion.registraAreaConcentracion(optativa.getAreaDeConcentracion());
                optativa.setAreaDeConcentracion(area);
                this.registrarAsignaturaOptativa(optativa);
                exito = true;
            }
        return exito;
    }
    /**
     * Obtiene las optativas del programa educativo
     * @param claveProgramaEducativo Clave programa educativo
     * @return Arreglo de asignaturas optativas.
     */
    public ArrayList<AsignaturaOptativa> obtenerOptativasProgramaEducativo(int claveProgramaEducativo){
        ArrayList<AsignaturaOptativa> optativas = new ArrayList<AsignaturaOptativa>();
        DAOAreaConcentracion daoArea = new DAOAreaConcentracion();
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT * FROM "+TABLA_OPTATIVAS+" WHERE "+COLUMNA_CVE_PROGRAMA+"='"+claveProgramaEducativo+"';";
            ResultSet resultado = sentencia.executeQuery(query);
            while(resultado.next()){
                int id = resultado.getInt(1);
                int cveAsignatura = resultado.getInt(2);
                int cveArea = resultado.getInt(3);
                AreaConcentracion area = daoArea.obtenerArea(cveArea);
                Asignatura asignatura = daoAsignatura.buscarAsignatura(cveAsignatura);
                AsignaturaOptativa optativa = new AsignaturaOptativa(area, asignatura.getClaveAsignatura(), asignatura.getNombre());
                optativas.add(optativa);
            }
            return optativas;
        }catch (SQLException ex) {
            Logger.getLogger(DAOAsignaturaOptativa.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    /**
     * Obtiene la clave del area de concentracion de una asignatura.
     * @param claveAsignatura Clave de la asignatura.
     * @return La clave de concentracion de una asignatura.
     */
    public int obtenerClaveAreaDeConcentracionDeLaAsignatura(int claveAsignatura) {
        int claveAreaConcentracion = -1;
        
        try {                        
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT "+COLUMNA_CVE_AREA_CONCENTRACION+" FROM "+TABLA_OPTATIVAS+" WHERE "+COLUMNA_CVE_ASIGNATURA+" = '"+claveAsignatura+"';";
            ResultSet resultado = sentencia.executeQuery(query);
            
            while(resultado.next()){
                claveAreaConcentracion = resultado.getInt(1);
            }
            
        } catch (SQLException ex) {
            Logger.getLogger(DAOAsignaturaOptativa.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return claveAreaConcentracion;
    }
    /**
     * Cierra la conexion a la base de datos.
     */
    public void cerrarConexionAAsignaturaOptativa() {
        acceso.cerrarConexion(conexion);
    }
     /**
      * Obtiene la asignatura optativa.
      * @param claveAsignaturaOptativa Clave de la asignatura optativa.
      * @return La asignatura encontrada.
      */
    public AsignaturaOptativa obtenerAsignaturaOptativa(int claveAsignaturaOptativa) {
        AsignaturaOptativa asignaturaOptativa = new AsignaturaOptativa();
        
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT * FROM "+TABLA_OPTATIVAS+" WHERE "+COLUMNA_ID+" = '"+claveAsignaturaOptativa+"';";
            ResultSet resultado = sentencia.executeQuery(query);
            
            while(resultado.next()) {
                int claveAsignatura = resultado.getInt(2);
                int claveAreaConcentracion = resultado.getInt(3);                                        
                
                DAOAsignatura daoAsignaturas = new DAOAsignatura();
                Asignatura asignatura = daoAsignaturas.buscarAsignatura(claveAsignatura);
                daoAsignaturas.cerrarConexionAAsignatura();
                
                DAOAreaConcentracion daoAreaConcentracion = new DAOAreaConcentracion();
                AreaConcentracion areaConcentracion = daoAreaConcentracion.obtenerArea(claveAreaConcentracion);
                daoAreaConcentracion.cerrarConexionAAreaConcentracion();
                                
                asignaturaOptativa.setClaveAsignatura(asignatura.getClaveAsignatura());
                asignaturaOptativa.setNombre(asignatura.getNombre());               
                asignaturaOptativa.setAreaDeConcentracion(areaConcentracion);
            }
            
        } catch (SQLException ex) {
            Logger.getLogger(DAOAsignaturaOptativa.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return asignaturaOptativa;
    }
    /**
     * Elimina todas las asignaturas de un programa educativo dado.
     * @param claveProgramaEducativo Clave del programa educativo.
     * @return Verdadero si se elimino falso si no se pudo eliminar.
     */
    public boolean eliminarOptativasProgramaEducativo(int claveProgramaEducativo){
        Statement sentencia = acceso.crearSentenciaBD(conexion);
        String query = "DELETE FROM "+TABLA_OPTATIVAS+" WHERE "+COLUMNA_CVE_PROGRAMA+"='"+claveProgramaEducativo+"';";
        try{
            int afectado = sentencia.executeUpdate(query);
            return(afectado>0);
        }catch(SQLException ex){
            return false;
        }
    }
    /**
     * Obtiene la clave de las asignaturas optativas.
     * @param claveAsignatura Clave de asignatura
     * @param claveProgramaEducativo Clave de programa educativo
     * @return Clave de la asignatura optativa.
     */
    public int obtenerClaveAsignaturaOptativa(int claveAsignatura, int claveProgramaEducativo) {
        int claveAsignaturaOptativa = -1;
        
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT "+COLUMNA_ID+" FROM "+TABLA_OPTATIVAS+" WHERE "+COLUMNA_CVE_ASIGNATURA+" = '"+claveAsignatura+"' AND "+COLUMNA_CVE_PROGRAMA+" = '"+claveProgramaEducativo+"';";
            ResultSet resultado = sentencia.executeQuery(query);
            
            while(resultado.next()) {
                claveAsignaturaOptativa = resultado.getInt(1);
            }
        } catch (SQLException ex) {
            Logger.getLogger(DAOAsignaturaOptativa.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return claveAsignaturaOptativa;
    }
}
